feat(profils): mode multi-profils — plusieurs enfants par appareil - #62
Merged
Conversation
Chaque enfant a désormais son propre profil (progression, badges, série, images mystère), stocké sous sa propre clé localStorage (multiplix-profile:<id>) avec un index léger (multiplix-profiles) qui liste les profils et le profil actif. L'ancien schéma mono-clé est migré automatiquement au premier lancement, sans perte. - Nouvel écran « Qui joue ? » au lancement dès 2 profils (pastille-initiale colorée stable par prénom) ; le parcours mono-profil reste inchangé. - « Ajouter un enfant » depuis l'espace parent (section Profils) ou depuis « Qui joue ? » : rejoue l'onboarding complet, annulable. - Bouton « changer de joueur » en haut de l'accueil (multi-profils only). - « Réinitialiser le profil » devient « Supprimer ce profil » : supprime le profil actif et route vers l'écran adapté (accueil de l'autre enfant, « Qui joue ? », ou onboarding s'il n'en reste aucun). - Import depuis Welcome = nouveau profil (jamais d'écrasement) ; import depuis l'espace parent = restauration du profil actif (inchangé). - inline script index.html, ErrorBoundary (sauvegarde de secours) et generate-user-guide adaptés au nouveau schéma ; specs §12 + changelog. Tests : multiProfile.test.tsx (migration legacy, ajout/sélection/annulation/ suppression en DOM réel) + mise à jour userJourney. https://claude.ai/code/session_01C2TMaVQwKBai1xMrEE4KmL
Contributor
|
Preview supprimée (PR fermée). Les URLs ne sont plus accessibles. |
Ajoute au guide utilisateur une section dédiée au mode multi-profils : capture de l'écran « Qui joue ? » (Léa + Max) et de l'accueil avec le bouton « changer de joueur ». seedProfile purge désormais les clés du schéma multi-profils avant chaque seed — les addInitScript s'empilent entre les captures et l'index écrit par seedMultiProfile masquait le profil legacy des captures suivantes (voice notamment). https://claude.ai/code/session_01C2TMaVQwKBai1xMrEE4KmL
Suppression et annulation d'ajout prenaient la même décision que le boot (« Qui joue ? » si plusieurs profils, accueil sinon, onboarding si aucun) mais la ré-implémentaient chacune en ternaires locaux. Les trois chemins passent désormais par initialScreen. La visibilité du bouton Annuler du Welcome s'aligne sur profileCount (la sémantique réelle : il existe déjà un profil) plutôt que sur l'état mémoire profile. https://claude.ai/code/session_01C2TMaVQwKBai1xMrEE4KmL
La PWA reste en mémoire des heures : l'enfant qui reprend la tablette n'est souvent pas celui qui l'a laissée, et le choix du joueur au boot ne couvre pas ce cas. Quand l'app revient au premier plan après plus de 15 minutes en arrière-plan et qu'il y a plusieurs profils, on repasse par l'écran de choix — uniquement depuis l'accueil (jamais en pleine séance, sur un récap ou dans l'espace parent), et jamais sur un aller-retour rapide (notification). Tests : seuil court vs long, exclusion mi-séance, mono-profil. Specs §12.1 mises à jour. https://claude.ai/code/session_01C2TMaVQwKBai1xMrEE4KmL
Le retour-picker au premier plan et le reload SW exprimaient deux fois la même notion (home/welcome/profiles = rien à perdre). Extraction d'un prédicat isDisposableScreen utilisé par les deux : le retour après une longue absence couvre désormais aussi un ajout d'enfant laissé en plan, comme le fait déjà le reload SW. Tests : helper seedProfiles pour le seeding deux-profils copié-collé dans 3 tests. https://claude.ai/code/session_01C2TMaVQwKBai1xMrEE4KmL
isc
marked this pull request as ready for review
June 11, 2026 19:07
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Quoi
Plusieurs enfants peuvent désormais partager le même appareil, chacun avec son propre profil : progression Leitner, badges, série et images mystère totalement indépendants.
Parcours
Stockage et migration
multiplix-profile:<id>) + un index léger (multiplix-profiles, {id, prénom} + profil actif). Invariant : l'index n'existe que s'il reste ≥ 1 profil — l'inline script deindex.htmlteste les deux clés pour le skip de la landing.Aussi
ErrorBoundary(sauvegarde de secours) etscripts/generate-user-guide.mjsadaptés au nouveau schéma.Tests
multiProfile.test.tsx(intégration DOM réelle) : migration legacy, ajout d'un 2ᵉ enfant + « Qui joue ? » au boot + bascule, annulation d'ajout, suppression avec bascule sur l'autre enfant, retour au premier plan (seuil court vs long, exclusion mi-séance, mono-profil).userJourneymis à jour (bouton renommé). 172 tests verts,tsc -beteslintpropres,npm run buildOK.https://claude.ai/code/session_01C2TMaVQwKBai1xMrEE4KmL